package com.kasinf.sample.sky.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.FieldDefaults;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.rely.FieldType;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDateTime;

/**
 * @Author : Kaiser
 * @Date: 2025/6/30  09:19
 */
@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ApiLogEsDO {
    @IndexId
    private String id;

    private Integer logType;
    /**
     * 链路追踪编号
     */
    private String traceId;
    /**
     * 用户ID
     */
    private Long userId;
    /**
     * 用户姓名
     */
    private String username;
    /**
     * 用户类型
     */
    private Integer userType;
    /**
     * 租户
     */
    private Long tenantId;
    /**
     * 应用名
     */
    @IndexField(fieldType = FieldType.KEYWORD)
    private String applicationName;
    /**
     * 开始时间
     */
    private String beginTime;
    /**
     * 操作模块
     */
    private String operateModule;
    /**
     * 操作名
     */
    private String operateName;
    /**
     * 操作分类
     */
    private Integer operateType; // 参见 OperateTypeEnum 枚举
    /**
     * 是否成功
     */
    private Integer success;

    /**
     * 结果提示
     */
    private String resultMsg;

    /**
     * 操作模块业务编号
     */
    private Long bizId;
    /**
     * 操作内容
     */
    private String action;
    /**
     * 拓展字段
     */
    private String extra;
    /**
     * 用户IP
     */
    private String userIp;

    /**
     * 请求方法名
     */
    private String requestMethod;
    /**
     * 结束时间
     */
    private String endTime;
    /**
     * 执行时长，单位：毫秒
     */
    private Integer duration;
    private String className;
    private String methodName;
    /*-------------------- 访问日志相关 -----------------------*/
    /**
     * 浏览器UserAgent
     */
    private String userAgent;
    /**
     * 结果码
     */
    private String resultCode;
    /**
     * 请求地址
     */
    private String requestUrl;
    /**
     * 请求参数
     */
    private String requestParams;
    /**
     * 请求头
     */
    private String requestHeaders;
    /**
     * 响应结果
     */
    private String responseBody;

    /*-------------------- 错误日志相关 -----------------------*/
    /**
     * 异常名
     */
    private String exceptionName;
    /**
     * 异常发生的类全名
     */
    private String exceptionClassName;
    /**
     * 异常发生的方法名
     */
    private String exceptionMethodName;
    /**
     * 异常发生的方法所在行
     */
    private Integer exceptionLineNumber;
    /**
     * 异常的栈轨迹异常的栈轨迹
     */
    private String exceptionStackTrace;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private LocalDateTime createTime;
}
